//
// Controlador de Usuário
// Controlador responsável pela ações do Usuário
// Autor: Raul Sampaio Correia
// Versão de 06/06/2009
//

class UsuarioController {
    
    def index = { redirect(action:list,params:params) }

    // the delete, save and update actions only accept POST requests
    static allowedMethods = [delete:'POST', save:'POST', update:'POST']

    def list = {
        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
        [ usuarioInstanceList: Usuario.list( params ), usuarioInstanceTotal: Usuario.count() ]
    }

    def show = {
        def usuarioInstance = Usuario.get( params.id )

        if(!usuarioInstance) {
            flash.message = "Usuário ${params.email} não encontrado"
            redirect(action:list)
        }
        else { return [ usuarioInstance : usuarioInstance ] }
    }

    // Action responsável por fazer o login do sistema e por redirecionar cada
    // tipo de usuário para o seu destino correto
    def login = {

        def emailUsuario = params.email
        def senhaUsuario = params.senha

        def usuarioAtual = Usuario.findByEmailAndHashSenha(emailUsuario, senhaUsuario.encodeAsPassword())

        if (usuarioAtual) {
            session["usuario"] = usuarioAtual
            if(usuarioAtual.nivel == Usuario.TIPO_ALUNO) {
                def alunoAtual = Aluno.findByEmail(usuarioAtual.email)
                if (usuarioAtual.hashSenha.equals(Usuario.SENHA_PADRAO.encodeAsPassword())) {
                    flash.message = "Você precisa alterar sua senha"
                }
                redirect(controller:'aluno', action:'show', id:alunoAtual.id)
            } else if (usuarioAtual.nivel == Usuario.TIPO_PROFESSOR) {
                def professorAtual = Professor.findByEmail(usuarioAtual.email)
                if (usuarioAtual.hashSenha.equals(Usuario.SENHA_PADRAO.encodeAsPassword())) {
                    flash.message = "Você precisa alterar sua senha"
                }
                redirect(controller:'professor', action:'show', id:professorAtual.id)
            } else if (usuarioAtual.nivel == Usuario.TIPO_COORDENACAO) {
                render("Usuário da Coordenação")
            } else if (usuarioAtual.nivel == Usuario.TIPO_ADMINISTRADOR) {
                render("Administrador")
            }
        } else {
            flash.message = "Usuário e/ou senha incorretos"
        }


    }

    def logout = {

        session.usuario = null;

    }

    def delete = {
        def usuarioInstance = Usuario.get( params.id )
        if(usuarioInstance) {
            try {
                usuarioInstance.delete()
                flash.message = "Usuário ${params.email} excluído"
                redirect(action:list)
            }
            catch(org.springframework.dao.DataIntegrityViolationException e) {
                flash.message = "Usuário ${params.email} não pode ser excluído"
                redirect(action:show,id:params.id)
            }
        }
        else {
            flash.message = "Usuário ${params.email} não encontrado"
            redirect(action:list)
        }
    }

    def edit = {
        def usuarioInstance = Usuario.get( params.id )

        if(!usuarioInstance) {
            flash.message = "Usuário ${params.id} não encontrado"
            redirect(action:list)
        }
        else {
            return [ usuarioInstance : usuarioInstance ]
        }
    }

    def update = {
        def usuarioInstance = Usuario.get( params.id )
        if(usuarioInstance) {
            if(params.version) {
                def version = params.version.toLong()
                if(usuarioInstance.version > version) {
                    
                    usuarioInstance.errors.rejectValue("version", "usuario.optimistic.locking.failure", "Another user has updated this Usuario while you were editing.")
                    render(view:'edit',model:[usuarioInstance:usuarioInstance])
                    return
                }
            }
            usuarioInstance.properties = params
            if(!usuarioInstance.hasErrors() && usuarioInstance.save()) {
                flash.message = "Usuário ${params.email} atualizado"
                redirect(action:show,id:usuarioInstance.id)
            }
            else {
                render(view:'edit',model:[usuarioInstance:usuarioInstance])
            }
        }
        else {
            flash.message = "Usuario ${params.email} não encontrado"
            redirect(action:edit,id:params.id)
        }
    }

    def create = {
        def usuarioInstance = new Usuario()
        usuarioInstance.properties = params
        return ['usuarioInstance':usuarioInstance]
    }

    def save = {
        def usuarioInstance = new Usuario(params)
        if(!usuarioInstance.hasErrors() && usuarioInstance.save()) {
            flash.message = "Usuário ${usuarioInstance.email} criado"
            redirect(action:show,id:usuarioInstance.id)
        }
        else {
            render(view:'create',model:[usuarioInstance:usuarioInstance])
        }
    }
}
